package com.crm.service.impl.index;


import com.crm.dao.mapper.contractManager.CustomerContractMapper;
import com.crm.dao.mapper.customMapper.cluePoolManagerCustomMapper.ClueContactCustomMapper;
import com.crm.dao.mapper.customMapper.csd.ContactMaintainMapper;
import com.crm.dao.mapper.customMapper.csd.ContractAndOrderMapper;
import com.crm.dao.mapper.customMapper.customerContractCustomMapper.CustomerContractCustomMapper;
import com.crm.dao.mapper.customMapper.customerManagerCustomMapper.CustomerStatisticsCustomMapper;
import com.crm.dao.mapper.customMapper.index.FirstPageCustomMapper;
import com.crm.dao.mapper.customMapper.returnMoneyManagerCustomMapper.ReturnMoneyLogCustomMapper;
import com.crm.model.entity.sys.UserAccount;
import com.crm.model.vo.index.PerformanceStatisticsVO;
import com.crm.model.vo.index.ProductVO;
import com.crm.model.vo.index.RankingVO;
import com.crm.model.vo.opportunityManager.PerformanceRankingVO;
import com.crm.service.index.FirstPageDbService;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 首页信息
 */
@Service
public class FirstPageDbServiceImpl implements FirstPageDbService {

    @Autowired
    private FirstPageCustomMapper firstPageCustomMapper;

    @Autowired
    private CustomerContractMapper customerContractMapper;

    @Autowired
    private ContractAndOrderMapper contractAndOrderMapper;

    @Autowired
    private ReturnMoneyLogCustomMapper returnMoneyLogCustomMapper;

    @Autowired
    private ContactMaintainMapper contactMaintainMapper;

    @Autowired
    private ClueContactCustomMapper clueContactCustomMapper;

    @Autowired
    private CustomerStatisticsCustomMapper customMapper;

    //合同管理--自定义mapper
    @Autowired
    private CustomerContractCustomMapper contractCustomMapper;

    /**
     * 查询用户下的客户会员数量
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    @Override
    public Integer selectCustomerMembershipNumber(String accountId, Integer dateUnit) {
        return firstPageCustomMapper.selectCustomerMembershipNumber(accountId, dateUnit);
    }

    /**
     * 查询用户下的联系人数
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    @Override
    public Integer selectContactNumber(String accountId, Integer dateUnit, String companyId) {
        return firstPageCustomMapper.selectContactNumber(accountId, dateUnit, companyId);
    }

    /**
     * 查询用户下的商机数
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    @Override
    public Integer selectOpportunityNumber(String accountId, Integer dateUnit) {
        return firstPageCustomMapper.selectOpportunityNumber(accountId, dateUnit);
    }

    /**
     * 查询用户的电话总时长
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    @Override
    public Integer selectTotalTelehoneHours(String accountId, Integer dateUnit) {
        return firstPageCustomMapper.selectTotalTelehoneHours(accountId, dateUnit);
    }

    /**
     * 查询用户的提成总金额
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    @Override
    public BigDecimal selectRoyaltyMoneyTotal(String accountId, Integer dateUnit) {
        return firstPageCustomMapper.selectRoyaltyMoneyTotal(accountId, dateUnit);
    }

    /**
     * 查询7天未联系的客户数量
     *
     * @param accountId 用户id
     * @param pastDate  7天前的日期
     * @return
     */
    @Override
    public Integer selectBeOverdueCustomerNumber(String accountId, String pastDate) {
        return firstPageCustomMapper.selectBeOverdueCustomerNumber(accountId, pastDate);
    }

    /**
     * 查询用户7天内新增跟进
     *
     * @param accountId 用户id
     * @param pastDate  7天前的日期
     * @return
     */
    @Override
    public Integer selectAddFollowNumber(String accountId, String pastDate) {
        return firstPageCustomMapper.selectAddFollowNumber(accountId, pastDate);
    }

    /**
     * 查询用户7天内新增订单
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    @Override
    public Integer selectAddOrderNumber(String accountId, Integer dateUnit) {
        return firstPageCustomMapper.selectAddOrderNumber(accountId, dateUnit);
    }

    /**
     * 查询用户7天内新增拜访
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    @Override
    public Integer selectAddFollowVisitNumber(String accountId, Integer dateUnit) {
        return firstPageCustomMapper.selectAddFollowVisitNumber(accountId, dateUnit);
    }

    /**
     * 首页统计个人业绩排行榜
     *
     * @param dateUnit  本月 1 上月
     * @param accountId 用户id
     * @param combination dateType 1 2021  2 202101
     * @return
     */
    @Override
    public List<PerformanceRankingVO> personalPerformanceRanking(Integer dateUnit, String accountId,String combination) {
        return firstPageCustomMapper.personalPerformanceRanking(dateUnit, accountId,combination);
    }

    /**
     * 查询用户7天内新增业绩
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    @Override
    public BigDecimal selectAddAchievement(String accountId, Integer dateUnit) {
        return firstPageCustomMapper.selectAddAchievement(accountId, dateUnit);
    }

    /**
     * 去年统计个人业绩
     *
     * @param accountId  用户id
     * @param startMonth 开始月份
     * @return endMonth 结束月份
     */
    @Override
    public List<PerformanceStatisticsVO> lastPerformanceTrend(String accountId, String startMonth, String endMonth) {
        return firstPageCustomMapper.performanceTrend(accountId, startMonth, endMonth);
    }

    /**
     * 今年统计个人业绩
     *
     * @param accountId  用户id
     * @param startMonth 开始月份
     * @return endMonth 结束月份
     * @return
     */
    @Override
    public List<PerformanceStatisticsVO> thisPerformanceTrend(String accountId, String startMonth, String endMonth) {
        return firstPageCustomMapper.performanceTrend(accountId, startMonth, endMonth);
    }

    /**
     * 产品成交排行榜
     * @param dateUnit 1年 2年月
     * @param combination dateType 1 2021  2 202101
     * @return
     */
    @Override
    public List<ProductVO> productTurnoverList(Integer dateUnit,String combination) {
        return firstPageCustomMapper.productTurnoverList(dateUnit,combination);
    }

    /**
     * 根据用户id查询业绩排名
     *
     * @param accountId 用户id
     * @param dateUnit  1本月 2上个月 3本年
     * @return
     */
    @Override
    public RankingVO selectRanking(String accountId, Integer dateUnit) {
        return firstPageCustomMapper.selectRanking(accountId, dateUnit);
    }

    /**
     * 二级管理业绩排名
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    @Override
    public RankingVO adminSelectRanking(String companyId, Integer dateUnit) {
        return firstPageCustomMapper.adminSelectRanking(companyId, dateUnit);
    }

    /**
     * 二级管理会员数量
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    @Override
    public Integer adminSelectCustomerMembershipNumber(String companyId, Integer dateUnit) {
        return firstPageCustomMapper.adminSelectCustomerMembershipNumber(companyId, dateUnit);
    }

    /**
     * 二级管理业绩金额
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    @Override
    public BigDecimal adminSelectperformanceAmount(String companyId, Integer dateUnit) {
        return firstPageCustomMapper.adminSelectperformanceAmount(companyId, dateUnit);
    }

    /**
     * 今年统计二级管理个人业绩
     *
     * @param companyId  公司id
     * @param startMonth 开始月份
     * @return endMonth 结束月份
     */
    @Override
    public List<PerformanceStatisticsVO> thisAdminPerformanceTrend(String companyId, String startMonth, String endMonth) {
        return firstPageCustomMapper.adminPerformanceTrend(companyId, startMonth, endMonth);
    }

    /**
     * 去年统计二级管理个人业绩
     *
     * @param companyId  公司id
     * @param startMonth 开始月份
     * @return endMonth 结束月份
     */
    @Override
    public List<PerformanceStatisticsVO> lastAdminPerformanceTrend(String companyId, String startMonth, String endMonth) {
        return firstPageCustomMapper.adminPerformanceTrend(companyId, startMonth, endMonth);
    }

    /**
     * 首页统计二级管理业绩排行榜
     *
     * @param dateUnit 本月 1 上月 2 本周 3 上周 4 今年 5 去年 6
     * @return
     */
    @Override
    public List<PerformanceRankingVO> adminCompanyPerformanceRanking(Integer dateUnit) {
        return firstPageCustomMapper.adminCompanyPerformanceRanking(dateUnit);
    }

    /**
     * 首页统计二级管理分公司下的业绩排行榜
     *
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4 今年 5 去年 6
     * @param companyId 公司id
     * @param accountId 超级管理员id
     * @return
     */
    @Override
    public List<PerformanceRankingVO> adminCompanyPersonalPerformanceRanking(Integer dateUnit, String companyId, String accountId) {
        return firstPageCustomMapper.adminCompanyPersonalPerformanceRanking(dateUnit, companyId, accountId);
    }

    /**
     * 首页统计二级管理分公司下的业绩排行榜
     *
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4 今年 5 去年 6
     * @param companyId 公司id
     * @param accountId 超级管理员id
     * @return
     */
    @Override
    public List<PerformanceRankingVO> adminCompanyPersonalPerformanceRank(Integer dateUnit, String companyId, List<String> accountIds) {
        return firstPageCustomMapper.adminCompanyPersonalPerformanceRank(dateUnit, companyId, accountIds);
    }

    /**
     * 二级管理会员增长率
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    @Override
    public BigDecimal selectMembershipGrowthRate(String companyId, Integer dateUnit) {
        return firstPageCustomMapper.selectMembershipGrowthRate(companyId, dateUnit);
    }

    /**
     * 二级管理会员续费率
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    @Override
    public BigDecimal selectMembershipRenewalRate(String companyId, Integer dateUnit) {
        return firstPageCustomMapper.selectMembershipRenewalRate(companyId, dateUnit);
    }

    /**
     * 二级管理会员流失率
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    @Override
    public BigDecimal selectMemberTurnoverRate(String companyId, Integer dateUnit) {
        return firstPageCustomMapper.selectMemberTurnoverRate(companyId, dateUnit);
    }

    /**
     * 二级管理会员流失率
     *
     * @param companyId 公司id
     * @param dateUnit  本月 1 上月 2 本周 3 上周 4
     * @return
     */
    @Override
    public Integer selectMemberTurnoverCount(String companyId, Integer dateUnit) {
        return firstPageCustomMapper.selectMemberTurnoverCount(companyId, dateUnit);
    }


    /**
     * 用户管理后台首页 统计信息
     */
    @Override
    public Map<String, Object> userFirstPageContent(String dateType) {

        UserAccount userAccount = (UserAccount) SecurityUtils.getSubject().getPrincipal();
        String accountId = userAccount.getAccountId();

        Map<String, Object> statistics = new HashMap<>();

        // 新增会员
        Long newMemberStatistics = contractCustomMapper.getNewMemberStatistics(dateType, accountId);
        statistics.put("newMember", newMemberStatistics);

        // 新增订单
        Long userNewOrder = contractAndOrderMapper.getUserNewOrder(dateType, accountId);
        statistics.put("newOrder", userNewOrder);

        // 新增业绩
        Double userNewPerformance = returnMoneyLogCustomMapper.getUserNewPerformance(dateType, accountId);
        statistics.put("newPerformance", userNewPerformance);

        // 新增联系人
        Long userNewContacts = contactMaintainMapper.getUserNewContacts(dateType, accountId);
        statistics.put("newContacts", userNewContacts);

        // 新增跟进
        Long userNewClue = clueContactCustomMapper.getUserNewClue(dateType, accountId);
        statistics.put("newFollow", userNewClue);

        // 新增商机
        Long userNewBusiness = customMapper.getUserNewBusiness(dateType, accountId);
        statistics.put("newBusiness", userNewBusiness);
        return statistics;
    }


    /**
     * 首页统计二级管理业绩排行榜
     *
     * @param dateUnit 本月 1 上月 2 本周 3 上周 4 今年 5 去年 6
     * @return
     */
    @Override
    public List<PerformanceRankingVO> adminCompanyPerformanceRank(String startDate, String endDate) {
        return firstPageCustomMapper.adminCompanyPerformanceRank(startDate, endDate);
    }

    /**
     * 首页统计按年个人业绩
     */
    @Override
    public List<PerformanceRankingVO> firstPageSalesmanByYear() {
        return firstPageCustomMapper.firstPageSalesmanByYear();
    }

    /**
     * 首页统计按年月个人业绩
     */
    @Override
    public List<PerformanceRankingVO> firstPageSalesmanByMonth() {
        return firstPageCustomMapper.firstPageSalesmanByMonth();
    }


}
